package thread;

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 刘远望
 * Date: 2025-05-27
 * Time: 18:48
 */
//生产消费者模型案例
public class Demo30 {
    public static void main(String[] args) {
        //至少一个生产者线程，一个消费者线程

        BlockingDeque<Integer> queue = new LinkedBlockingDeque<>(100);//阻塞队列大小为100
        //BlockingQueue<Integer> queue2 = new LinkedBlockingQueue<>(100);//阻塞队列大小为100

        Thread producer = new Thread(() -> {//生产者线程
            int n = 0;
            while (true) {
                try {
                    queue.put(n);
                    System.out.println("生产元素 " + n);
                    //Thread.sleep(1000);//这里加上sleep才导致两个线程效率不匹配进而影响整体的性能
                    n++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }, "producer");

        Thread consumer = new Thread(() -> {//消费者线程
            try {
                while (true) {
                    Integer n = queue.take();
                    System.out.println("消费元素 " + n);
                    Thread.sleep(1000);//这里也是限制
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "consumer");

        /**
         * 以上生产者和消费者之间速度差不多 能达到一种平衡 基本不会阻塞 效率很高
         * 这里阻塞是为了突发情况 保证安全 (防止信息量暴增) 生产消费者模型就是在尽量不阻塞(平衡生产者消费者之间的效率)的情况下达到最高效率
         */
        producer.start();
        consumer.start();
    }
}
